package main

import (
	"fmt"
	"reflect"
)

// 结构体反射
type student struct {
	Name  string `json:"name"`
	Score int    `json:"score"`
}

func main() {
	stu1 := student{
		Name:  "小小",
		Score: 18,
	}
	t := reflect.TypeOf(stu1) // TypeOf()函数可以获得任意值的类型对象
	fmt.Println(t)            // main.student
	fmt.Println(t.Name())     // 类型
	fmt.Println(t.Kind())     // 种类

	// 通过for循环遍历所以结构体字段信息
	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		fmt.Printf("name :%s index:%d type:%v json tag:%v\n", field.Name, field.Index, field.Type, field.Tag.Get("json"))
	}
	// 通过字段名获取结构体中的指定字段信息
	fileIdInfo, ok := t.FieldByName("Score")
	if !ok {
		fmt.Println("field by name error")
		return
	}
	fmt.Printf("name:%s index:%d type:%v josn tag:%v\n", fileIdInfo.Name, fileIdInfo.Index, fileIdInfo.Type, fileIdInfo.Tag.Get("json"))
}
